import requests
import random
import string
from flask import request, redirect, jsonify
from flaskapp.entity.User import User
from flaskapp.util.Redprint import Redprint
from flaskapp.util.Result import Result
from flask_jwt_extended import create_access_token

api = Redprint('oauth')

# 配置参数
GITEE_CLIENT_ID = 'af615dae2aa9f2045826e8f4dd18ebb77a1894855d88d4a52b92cd98052bd408'
GITEE_CLIENT_SECRET = '1e4625c100634878757c5cd092a606be931cebc7bfaf0538467e10aeebe9da68'
GITEE_REDIRECT_URI = 'http://127.0.0.1:5000/api/oauth/gitee/callback'  # 你后端暴露的回调地址，需和Gitee后台配置一致

def generate_random_string(length=8):
    return ''.join(random.choices(string.ascii_letters + string.digits, k=length))

@api.route('/gitee/login')
def gitee_login():
    # 第一步，重定向到gitee授权页面
    gitee_auth_url = (
        f"https://gitee.com/oauth/authorize?client_id={GITEE_CLIENT_ID}"
        f"&redirect_uri={GITEE_REDIRECT_URI}&response_type=code&scope=user_info"
    )
    return redirect(gitee_auth_url)

@api.route('/gitee/callback')
def gitee_callback():
    code = request.args.get('code')
    if not code:
        return Result.error(400, '缺少code参数')

    # 第二步，用code换取access_token
    token_url = "https://gitee.com/oauth/token"
    data = {
        'grant_type': 'authorization_code',
        'code': code,
        'client_id': GITEE_CLIENT_ID,
        'client_secret': GITEE_CLIENT_SECRET,
        'redirect_uri': GITEE_REDIRECT_URI
    }
    token_resp = requests.post(token_url, data=data)
    if token_resp.status_code != 200:
        return Result.error(500, '获取access_token失败')
    token_json = token_resp.json()
    access_token = token_json.get('access_token')
    if not access_token:
        return Result.error(500, 'access_token不存在')

    # 第三步，使用access_token获取用户信息
    user_info_url = "https://gitee.com/api/v5/user"
    headers = {'Authorization': f'token {access_token}'}
    user_resp = requests.get(user_info_url, headers=headers)
    if user_resp.status_code != 200:
        return Result.error(500, '获取用户信息失败')
    user_info = user_resp.json()
    account_name = user_info.get('login')
    if not account_name:
        return Result.error(500, '用户登录名不存在')

    # 第四步，查询数据库是否有此account_name
    user = User.query.filter_by(account_name=account_name).first()
    if not user:
        # 不存在，创建新用户
        username = generate_random_string(10)
        password = generate_random_string(12)
        user = User(account_name=account_name, username=username, password=password)
        user.addUser()

    # 第五步，生成token，登录成功
    access_token = create_access_token(identity={
        'user_id': user.user_id,
        'username': user.username,
        'is_admin': user.is_admin
    })

    # 你可以选择重定向到前端页面，并把token放在url参数，或者直接返回json
    # 这里示例直接重定向带token，前端登录页接收后处理
    frontend_url = f"http://localhost:8070/login?token={access_token}&username={user.account_name}&userid={user.user_id}"
    return redirect(frontend_url)